// noinspection JSUnresolvedReference /** * Field Google Map */ /* global jQuery, document, redux_change, redux, google */ (function ( $ ) { 'use strict'; redux.field_objects = redux.field_objects || {}; redux.field_objects.google_maps = redux.field_objects.google_maps || {}; /* LIBRARY INIT */ redux.field_objects.google_maps.init = function ( selector ) { if ( ! selector ) { selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' ); } $( selector ).each( function ( i ) { let delayRender; const el = $( this ); let parent = el; if ( ! el.hasClass( 'redux-field-container' ) ) { parent = el.parents( '.redux-field-container:first' ); } if ( parent.is( ':hidden' ) ) { return; } if ( parent.hasClass( 'redux-field-init' ) ) { parent.removeClass( 'redux-field-init' ); } else { return; } // Check for delay render, which is useful for calling a map // render after JavaScript load. delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) ); // API Key button. redux.field_objects.google_maps.clickHandler( el ); // Init our maps. redux.field_objects.google_maps.initMap( el, i, delayRender ); } ); }; /* INIT MAP FUNCTION */ redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) { let delayed; let scrollWheel; let streetView; let mapType; let address; let defLat; let defLong; let defaultZoom; let mapOptions; let geocoder; let g_autoComplete; let g_LatLng; let g_map; let noLatLng = false; // Pull the map class. const mapClass = el.find( '.redux_framework_google_maps' ); const containerID = mapClass.attr( 'id' ); const autocomplete = containerID + '_autocomplete'; const canvas = containerID + '_map_canvas'; const canvasId = $( '#' + canvas ); const latitude = containerID + '_latitude'; const longitude = containerID + '_longitude'; // Add map index to data attr. // Why, say we want to use delay_render, // and want to init the map later on. // You'd need the index number in the // event of multiple map instances. // This allows one to retrieve it // later. $( mapClass ).attr( 'data-idx', idx ); if ( true === delayRender ) { return; } // Map has been rendered, no need to process again. if ( $( '#' + containerID ).hasClass( 'rendered' ) ) { return; } // If a map is set to delay render and has been initiated // from another scrip, add the 'render' class so rendering // does not occur. // It messes things up. delayed = Boolean( mapClass.data( 'delay-render' ) ); if ( true === delayed ) { mapClass.addClass( 'rendered' ); } // Create the autocomplete object, restricting the search // to geographical location types. g_autoComplete = await google.maps.importLibrary( 'places' ); g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} ); // Data bindings. scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) ); streetView = Boolean( mapClass.data( 'street-view' ) ); mapType = Boolean( mapClass.data( 'map-type' ) ); address = mapClass.data( 'address' ); address = decodeURIComponent( address ); address = address.trim(); // Set default Lat/lng. defLat = canvasId.data( 'default-lat' ); defLong = canvasId.data( 'default-long' ); defaultZoom = canvasId.data( 'default-zoom' ); // Eval whether to set maps based on lat/lng or address. if ( '' !== address ) { if ( '' === defLat || '' === defLong ) { noLatLng = true; } } else { noLatLng = false; } // Can't have empty values, or the map API will complain. // Set default for the middle of the United States. defLat = defLat ? defLat : 39.11676722061108; defLong = defLong ? defLong : -100.47761000000003; if ( noLatLng ) { // If displaying a map based on an address. geocoder = new google.maps.Geocoder(); // Set up Geocode and pass address. geocoder.geocode( {'address': address}, function ( results, status ) { let latitude; let longitude; // Function results. if ( status === google.maps.GeocoderStatus.OK ) { // A good address was passed. g_LatLng = results[0].geometry.location; // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); // Get and set lat/long data. latitude = el.find( '#' + containerID + '_latitude' ); latitude.val( results[0].geometry.location.lat() ); longitude = el.find( '#' + containerID + '_longitude' ); longitude.val( results[0].geometry.location.lng() ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } else { // No data found, alert the user. alert( 'Geocode was not successful for the following reason: ' + status ); } } ); } else { // If displaying map based on an lat/lng. g_LatLng = new google.maps.LatLng( defLat, defLong ); // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, // Start off far unless an item is selected, set by php. streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create the map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } }; redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) { let markerTooltip; let infoWindow; let g_marker; let geoAlert = mapClass.data( 'geo-alert' ); // Get HTML. const input = document.getElementById( autocomplete ); // Set objects into the map. g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input ); // Bind objects to the map. g_autoComplete = new google.maps.places.Autocomplete( input ); g_autoComplete.bindTo( 'bounds', g_map ); // Get the marker tooltip data. markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Create infoWindow. infoWindow = new google.maps.InfoWindow(); // Create marker. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), draggable: true, title: markerTooltip, animation: google.maps.Animation.DROP } ); geoAlert = decodeURIComponent( geoAlert ); // Place change. google.maps.event.addListener( g_autoComplete, 'place_changed', function () { let place; let address; let markerTooltip; infoWindow.close(); // Get place data. place = g_autoComplete.getPlace(); // Display alert if something went wrong. if ( ! place.geometry ) { window.alert( geoAlert ); return; } console.log( place.geometry.viewport ); // If the place has a geometry, then present it on a map. if ( place.geometry.viewport ) { g_map.fitBounds( place.geometry.viewport ); } else { g_map.setCenter( place.geometry.location ); g_map.setZoom( 17 ); // Why 17? Because it looks good. } markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Set the marker icon. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), title: markerTooltip, clickable: true, draggable: true, animation: google.maps.Animation.DROP } ); // Set marker position and display. g_marker.setPosition( place.geometry.location ); g_marker.setVisible( true ); // Form array of address components. address = ''; if ( place.address_components ) { address = [( place.address_components[0] && place.address_components[0].short_name || '' ), ( place.address_components[1] && place.address_components[1].short_name || '' ), ( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' ); } // Set the default marker info window with address data. infoWindow.setContent( '
' + place.name + '
' + address ); infoWindow.open( g_map, g_marker ); // Run Geolocation. redux.field_objects.google_maps.geoLocate( g_autoComplete ); // Fill in address inputs. redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete ); } ); // Marker drag. google.maps.event.addListener( g_marker, 'drag', function ( event ) { document.getElementById( latitude ).value = event.latLng.lat(); document.getElementById( longitude ).value = event.latLng.lng(); } ); // End marker drag. google.maps.event.addListener( g_marker, 'dragend', function () { redux_change( el.find( '.redux_framework_google_maps' ) ); } ); // Zoom Changed. g_map.addListener( 'zoom_changed', function () { el.find( '.google_m_zoom_input' ).val( g_map.getZoom() ); } ); // Marker Info Window. infoWindow = new google.maps.InfoWindow(); google.maps.event.addListener( g_marker, 'click', function () { const marker_info = containerID + '_marker_info'; const infoValue = document.getElementById( marker_info ).value; if ( '' !== infoValue ) { infoWindow.setContent( infoValue ); infoWindow.open( g_map, g_marker ); } } ); }; /* FILL IN ADDRESS FUNCTION */ redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) { // Set variables. const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' ); // What if someone only wants city, or state, ect... // gotta do it this way to check for the address! // Need to check each of the returned components to see what is returned. const componentForm = { street_number: 'short_name', route: 'long_name', locality: 'long_name', administrative_area_level_1: 'short_name', country: 'long_name', postal_code: 'short_name' }; // Get the place details from the autocomplete object. const place = g_autoComplete.getPlace(); let component; let i; let addressType; let _d_addressType; let val; let len; document.getElementById( latitude ).value = place.geometry.location.lat(); document.getElementById( longitude ).value = place.geometry.location.lng(); for ( component in componentForm ) { if ( componentForm.hasOwnProperty( component ) ) { // Push in the dynamic form element ID again. component = containerID + '_' + component; // Assign to proper place. document.getElementById( component ).value = ''; document.getElementById( component ).disabled = false; } } // Get each component of the address from the place details // and fill the corresponding field on the form. len = place.address_components.length; for ( i = 0; i < len; i += 1 ) { addressType = place.address_components[i].types[0]; if ( componentForm[addressType] ) { // Push in the dynamic form element ID again. _d_addressType = containerID + '_' + addressType; // Get the original. val = place.address_components[i][componentForm[addressType]]; // Assign to proper place. document.getElementById( _d_addressType ).value = val; } } }; redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) { if ( navigator.geolocation ) { navigator.geolocation.getCurrentPosition( function ( position ) { const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude ); const circle = new google.maps.Circle( { center: geolocation, radius: position.coords.accuracy } ); g_autoComplete.setBounds( circle.getBounds() ); } ); } }; /* API BUTTON CLICK HANDLER */ redux.field_objects.google_maps.clickHandler = function ( el ) { // Find the API Key button and react on click. el.find( '.google_m_api_key_button' ).on( 'click', function () { // Find message wrapper. const wrapper = el.find( '.google_m_api_key_wrapper' ); if ( wrapper.is( ':visible' ) ) { // If the wrapper is visible, close it. wrapper.slideUp( 'fast', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } else { // If the wrapper is visible, open it. wrapper.slideDown( 'medium', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } } ); el.find( '.google_m_autocomplete' ).on( 'keypress', function ( e ) { if ( 13 === e.keyCode ) { e.preventDefault(); } } ); // Auto select autocomplete contents, // since Google doesn't do this inherently. el.find( '.google_m_autocomplete' ).on( 'click', function ( e ) { $( this ).trigger( 'focus' ); $( this ).trigger( 'select' ); e.preventDefault(); } ); }; } )( jQuery ); Onlayn kazinolarda 888 slotlarining qulay interfeysi va oddiy o‘yin jarayoni – Orchid Group
Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Onlayn kazinolarda 888 slotlarining qulay interfeysi va oddiy o‘yin jarayoni

Onlayn kazinolarda 888 slotlarining qulay interfeysi va oddiy o‘yin jarayoni

Bugungi kunda onlayn kazinolar o‘yinchilarga turli xil slot mashinalarini taklif etadi, ulardan biri sifatida 888 slotlari alohida e’tiborni tortadi. Ushbu o‘yinlarning interfeysi oddiyligi va intuitivligi ko‘plab foydalanuvchilar uchun katta afzallik hisoblanadi. 888 slotlari o‘zining qulay boshqaruv elementlari va sodda o‘yin jarayoni bilan yangi boshlovchilar hamda tajribali o‘yinchilar orasida mashhurlik qozongan. Bu o‘yinlar nafaqat ko‘ngil ochar, balki o‘ziga xos dizayni bilan ham ajralib turadi, shuningdek, har qanday qurilmada muammosiz ishlashga mo‘ljallangan.

888 slotlarining interfeys xususiyatlari

888 slotlarining interfeysi o‘yinchilar uchun maksimal qulaylikni ta’minlashga qaratilgan. Eng avvalo, o‘yin maydonining tartiblangan joylashuvi va aniq ko‘rsatilgan tugmalar o‘zaro faoliyatni soddalashtiradi. Rul, stavkalarni sozlash, autoplay rejimi — bularning barchasi o‘yin ichida osongina topiladi va boshqariladi. Qulay ranglar palitrasi va grafikalar o‘yin tajribasini yanada yoqimli qiladi, shuningdek, ko‘zga yoqimli va charchatmaydigan interfeys yaratadi. Ushbu elementlar o‘yin jarayonini maksimal darajada intuitiv va tushunarli qiladi.

Oddiy o‘yin jarayoni: qanday boshlash va o‘ynash

888 slotlarini o‘ynash juda sodda va ko‘p vaqt talab qilmaydi. Avvalo, o‘yin hisobini yaratish yoki mavjud hisobga kirish zarur. Keyin o‘yin uchun mos stavkani tanlash va aylantirish tugmasini bosish kifoya. O‘yin avtomatlari turli xil mukofotlar va bonus funksiyalariga ega bo‘lib, ular o‘yinni yanada jozibador qiladi. Ko‘pgina slotlarda, ayniqsa 888 seriyasida, qo‘shimcha spinlar, multiplikatorlar va boshqa qiziqarli imkoniyatlar mavjud. O‘yin jarayoni davomida o‘yinchilar uchun oson tushunarli ko‘rsatkichlar va natijalar taqdim etiladi, bu esa o‘yin sifatini oshiradi.

Texnik jihatlar va tizim talablariga doir ma’lumotlar

888 slotlari zamonaviy texnologiyalar asosida ishlab chiqilgan bo‘lib, ular kompyuter, planshet va smartfon kabi turli qurilmalarda yuqori sifatda ishlaydi. Ushbu o‘yinlar HTML5 texnologiyasidan foydalanib yaratilgan, shuning uchun ular brauzerda qo‘shimcha dasturlarni o‘rnatmasdan ishga tushadi. Internet tezligi o‘yin tajribasiga ta’sir qilishi mumkin, biroq ko‘pchilik hollarda 888 slotlari hatto o‘rtacha tezlikdagi ulanishda ham barqaror ishlaydi. Shuningdek, o‘yinlarning doimiy yangilanishi va qo‘llab-quvvatlanishi ular ishonchliligini oshiradi.

O‘yin davomida xavfsizlik va mas’uliyat

Onlayn o‘yinlar davomida xavfsizlik masalalari alohida ahamiyatga ega. 888 slotlarida o‘yinchilarning shaxsiy ma’lumotlari va moliyaviy tranzaksiyalari himoyalangan bo‘lib, zamonaviy shifrlash texnologiyalari qo‘llaniladi. Shu bilan birga, o‘yin jarayonida mas’uliyatli yondashuv muhim hisoblanadi. O‘yinchilar o‘z imkoniyatlarini baholashlari va o‘yinlarni o‘ynashda chegaralar belgilashlari lozim. Bu nafaqat moliyaviy xavfsizlik, balki psixologik barqarorlik uchun ham foydalidir. O‘yinlarni qiziqarli dam olish sifatida ko‘rish va ularga haddan ortiq bog‘lanmaslik tavsiya etiladi.

Qulaylik va o‘yinchilarga beriladigan imkoniyatlar

888 slotlari o‘zining qulay interfeysi bilan bir qatorda o‘yinchilarga keng turdagi imkoniyatlar yaratadi. Masalan, turli to‘lov tizimlari orqali depozitlar va pul yechib olish operatsiyalari sodda va tez amalga oshiriladi. Shuningdek, o‘yin ichidagi statistika va natijalarni kuzatish funksiyasi mavjud bo‘lib, bu o‘yinchilarga o‘z strategiyalarini ishlab chiqish va o‘yin jarayonini yaxshilashda yordam beradi. Ko‘plab slotlarda bonus dasturlari va sovrinli o‘yinlar ham mavjud, ular o‘yin tajribasini boyitadi va rag‘batlantiradi.

Natijalar va o‘yin doirasidagi muhim jihatlar

Onlayn kazinolarda 888 slotlarining qulay interfeysi va oddiy o‘yin jarayoni o‘zaro uyg‘unlashgan holda foydalanuvchilarga yoqimli va samarali o‘yin tajribasini taqdim etadi. Ushbu o‘yinlarning tanlovda kengligi, grafik va dizaynning jozibadorligi, shuningdek, texnik barqarorligi o‘yinchilar orasida katta talabga ega. Oddiy boshqaruv va tez o‘rganiladigan qoidalar tufayli yangi o‘yinchilar ham o‘zini erkin his qiladi. Shu bilan birga, o‘yin davomida ehtiyotkorlik va mas’uliyatni saqlash muhimdir, chunki har qanday o‘yin muayyan xavflarni o‘z ichiga oladi.

Design and Develop by Ovatheme